/*
 * base.js
 * 基本设置
 */
define(['static/app/alert',
	"jquery",
	"Bootstrap"], function(Alert){
	
    /**
     * 对jquery.ajax进行包装（不改变使用方式）
     * 目的是统一处理公共需求
     */
	(function(){
		//授权验证标志
		var AuthFlag = false;
		//服务端异常验证标志
		var serverErrorFlag = false;
		
		//ajax方法clone
		var _ajax = $.ajax;
		
		//ajax方法重新定义
		$.ajax = function(param) {
			//ajax deferred promise 保持原有promise操作
			var promise;
			
			var _param = $.extend({}, {autoWrap : true}, param);
			
			//如果不需要默认的封装:autoWrap = false;
			if (!_param.autoWrap) {
				promise = _ajax(_param);
				//直接返回
				return promise;
			}
			
			//默认ajax options
			var defaultOpts = {
				type: "POST",
				dataType: "json",
				cache: false,
				headers: {
					"CSRFToken" : getCSRFToken()
				}
			};
			//deep extend
			_param = $.extend(true, defaultOpts, _param);
			
			//add t
			if (!_param.cache) {
				var _url = _param.url || ""; 
				var date = new Date();
				var T = "T=" + date.getFullYear() + date.getMonth() + date.getDate() + date.getHours() + date.getMinutes() + date.getSeconds() + date.getMilliseconds();
				if (_url.indexOf("?") != -1) {
					_url += "&" + T;
				} else {
					_url += "?" + T;
				}
				_param.url = _url;
			}
			
			if (_param.success) {
				_param.callback = _param.success;
				delete _param.success;
			}
			
			promise = _ajax($.extend({
				success:function(response){
					var code = response.status || response.code || "200";
					//如果是整形，转换为字符串
					typeof(code) == "number" && (code = code + "");
					//状态码控制
					switch(code){
						case "200":
							if (_param.callback) {
								response.hasOwnProperty("data") ? _param.callback(response.data) : _param.callback(response);
							}
							break;
						case "401":
							//弹出框重新登录
							top.RELOGIN.reLogin(function(){
								// 登录成功之后重新执行下当前请求
                                $.ajax(param);
                            });

							break;
						case "400":
							//客户端错误：受到攻击或者请求异常
							Alert({
								message: "请求异常"
							});
							break;
						case "403":
							//未授权
							if (!AuthFlag) {
								Alert({
									message: "请求的资源未授权"
								});
								AuthFlag = true;
								//过一段时间再设置成false
								setTimeout(function(){
									AuthFlag = false;
								}, 2000);
							}
							break;
						case '500':
                            var info = '<p><code>服务器端异常：</code>' + (response.msg || response.message) + '</p>';
                            var config = {
                                message: info,
                                dialogSize: 'M'
                            };
                            Alert(config);
							break;
						default :
							Alert({
								message: "<code>" + code + ":</code>服务器端异常，请联系管理员<br/>" + (response.msg || response.message)
							});
					}
				},
				error: function(XMLHttpRequest, textStatus, errorThrown){
					console.log("ajax error:" + textStatus);
				}
			}, _param));
			
			return promise;
		};
	})();

    /**
     * 复写bootstrap的modal组件的hideModal方法，为了防止多个modal同时打开时对body产生的padding和滚动条的影响
     * 注意：更新bootstrap时，注意bootstrap的hideModal会有更新
     * by elva
     */
    +function() {
    	//避免padding的影响
    	$.fn.modal.Constructor.prototype.setScrollbar = function(){};		//清空setScrollbar方法
    	$.fn.modal.Constructor.prototype.resetScrollbar = function(){};		//清空resetScrollbar方法
    	//避免滚动条的影响
    	var old = $.fn.modal.Constructor.prototype.hideModal;
    	$.fn.modal.Constructor.prototype.hideModal = function() {			//重写hideModal方法
    		var that = this;
    	    this.$element.hide();
    	    this.backdrop(function () {
    	      if ($(".modal.in").length == 0) {
    	        that.$body.removeClass('modal-open');
    	        that.resetScrollbar() 
    	      }
    	      that.resetAdjustments();
    	      that.$element.trigger('hidden.bs.modal')
    	    })
    	}
    }();

    
    return {}
});